package com.gigi.datageniebackendmaster.common;

import com.gigi.datageniebackendmaster.model.enums.ErrorCodeEnum;
import com.gigi.datageniebackendmaster.util.ThrowUtil;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 限流服务
 *
 * @author Gigi
 * @date 2024/7/29 16:40
 */
@Service
@Profile("dev")
public class RedisLimiterManager {

    @Resource
    private RedissonClient redissonClient;

    /**
     * 限流操作
     *
     * @param key 用来区分不同的限流器，比如不同的用户 id 分别统计
     */
    public void doRateLimit(String key) {
        // 创建限流器
        RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
        // 每秒访问限制为 2 次
        rateLimiter.trySetRate(RateType.OVERALL, 2, 1, RateIntervalUnit.SECONDS);
        // 一次操作获取 1 个令牌，若获取失败则抛出异常
        ThrowUtil.throwIf(!rateLimiter.tryAcquire(1), ErrorCodeEnum.TOO_MANY_REQUESTS_ERROR);
    }

}
